const mqtt = require('mqtt');

let client;

export default {
	/**
	 * 连接订阅
	 * @param {String} host 服务器地址
	 * @param {Integer} port 服务器端口
	 * @param {Object} conOptions 连接选项
	 * @param {StringOrArray} topic 订阅主题，数组
	 * @param {Object} subOptions 订阅选项
	 * @param {Function} callback 订阅回调
	 */
	connect: function(host, port, conOptions, topic, subOptions, callback) {
		// 匹配对应protocol
		let protocol = 'mqtt';
		// #ifdef H5 || APP || APP-VUE
		protocol = 'ws';
		// #endif
		// #ifdef MP-WEIXIN || APP-PLUS
		protocol = 'wxs';
		// #endif
		// #ifdef MP-ALIPAY
		protocol = 'alis';
		// #endif

		// 拼接Uri
		const uri = protocol + "://" + host + ":" + port + "/mqtt";

		// 客户端连接
		client = mqtt.connect(uri, Object.assign({}, conOptions));
		if (client) {
			client.on('connect', function() {
				if (client.connected) {
					console.log(client.options.clientId, uri, 'connect ok');

					client.subscribe(topic, Object.assign({}, subOptions), function(err, granted) {
						if (!err) {
							console.log('subscribe ok:', JSON.stringify(granted));

							client.on('message', function(topic, message, packet) {
								if (callback && typeof callback === "function") {
									callback(topic, message);
								}
							});
						} else {
							console.error('subscribe error:', err);
						}
					});
				} else {
					console.error(client.options.clientId, uri, 'connect fail', client);
				}
			});
		} else {
			console.error(client.options.clientId, uri, 'connect error');
		}
	},
	/**
	 * 发布消息
	 * @param {String} topic 发布主题，字符串
	 * @param {Object} options 发布选项
	 * @param {BufferOrString} message 消息
	 * @param {Function} callback 发布回调
	 */
	publish: function(topic, options, message, callback) {
		if (!client) {
			console.error('client not connected');
			return;
		}

		client.publish(topic, message, Object.assign({}, options), function(err) {
			if (err) {
				console.error(err);
			} else {
				if (callback && typeof callback === 'function') {
					callback(topic);
				}
			}
		});
	}
}
